package com.itheima.service.impl;

import com.itheima.dao.OrderDao;
import com.itheima.domain.Order;
import com.itheima.service.OrderService;
import com.itheima.utils.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    private OrderDao orderDao;

    @Autowired
    private RedisUtil redisUtil;

    @Override
    public List<Order> findOrderList(int buyerId) {
        List<Order> orderList = orderDao.findBuyerOrderListById(buyerId);
        if (orderList == null) {
            return null;
        }
        return orderList;
    }

    @Override
    public int insertOrder(Order order) {
        int result = orderDao.insertOrder(order);
        return result;
    }

    @Override
    public Order findOrderById(int orderId) {
        return orderDao.findOrderById(orderId);
    }

    @Override
    public int orderCancel(int orderId) {
        return orderDao.updateStatus3(orderId);
    }

    @Override
    public int orderRefund(int orderId) {
        return orderDao.updateStatus4(orderId);
    }

    @Override
    public int orderEnter(int orderId) {
        return orderDao.updateStatus2(orderId);
    }

    @Override
    public int orderDelete(int orderId) {
        return orderDao.updateStatus1i(orderId);
    }

    @Override
    public int orderPay(Date paymentTime, int orderId) {
        System.out.println("正在支付订单: " + orderId);

        // 1. 先查询订单是否为“待支付”状态（避免重复支付或支付已取消订单）
        Order order = orderDao.findOrderById(orderId);
        if (order == null || order.getStatus() != 0) {
            System.out.println("订单" + orderId + "无需支付（不存在或已变更状态）");
            return 0; // 支付失败
        }

        // 2. 更新数据库订单状态为“已支付”（status=1）
        int result = orderDao.updateStatus1(paymentTime, orderId);
        if (result > 0) {
            // 3. 关键：支付成功后，从Redis ZSet中删除该订单（避免定时任务扫描）
            String redisZSetKey = "order:timeout:zset"; // 和insertOrderWithTimeout的键一致
            redisUtil.zRemove(redisZSetKey, orderId); // 移除订单ID
            System.out.println("订单" + orderId + "支付成功，已从Redis ZSet移除");
        }

        return result;
    }
    @Override
    public Order findOrderByOrderNumber(String orderNumber) {
        return orderDao.findOrderByOrderNumber(orderNumber);
    }

    @Override
    public int editOrder(String buyerPhone, String address, String hintInfo, int orderId) {
        return orderDao.editOrder(buyerPhone, address, hintInfo, orderId);
    }

    @Override
    public List<Order> findValidOrdersByBuyerId(int buyerId) {
        return orderDao.findValidOrdersByBuyerId(buyerId);
    }

    @Override
    public List<Order> findValidOrdersBySellerId(int sellerId) {
        return orderDao.findValidOrdersBySellerId(sellerId);
    }

    @Override
    public int insertOrderWithTimeout(Order order, long timeoutMinutes) {
        //1.先设置订单状态为”待支付
        order.setStatus(0); // 关键：只有待支付订单才需要超时关闭
        order.setCreateTime(new Date()); // 设置创建时间

        //2.插入数据库
        int result=orderDao.insertOrder(order);
        if(result<=0){
            return  result;//从数据库插入失败，不操作redis
        }

        //3.计算超时时间戳（当前时间+timeoutMinutes分钟，转毫秒）
        long currentTime = System.currentTimeMillis();
        long timeoutTimestamp = currentTime + (timeoutMinutes * 60 * 1000); // 分钟转毫秒

        // 4. 把订单ID存入Redis ZSet（键名建议规范，比如"order:timeout:zset"）
        String redisZSetKey = "order:timeout:zset"; // ZSet的统一键，后续定时任务用这个键查
        Boolean zAddResult = redisUtil.zAdd(redisZSetKey, order.getOrderId(), timeoutTimestamp);

        // 5. 返回结果（ZSet插入成功与否不影响数据库，但可日志记录异常）
        if (!zAddResult) {
            // 这里可以加日志，比如“订单ID:xx存入Redis超时列表失败”，便于排查
            System.out.println("订单ID: " + order.getOrderId() + " 存入Redis超时列表失败");
        }
        return result; // 返回数据库插入结果（1表示成功）


    }


}
